/**
 * Copyright (c) 2008, Andrew Carter All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer. Redistributions in binary
 * form must reproduce the above copyright notice, this list of conditions and
 * the following disclaimer in the documentation and/or other materials provided
 * with the distribution. Neither the name of Andrew Carter nor the names of
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

package com.acarter.scenemonitor.util;

import com.jme.renderer.Renderer;
import com.jme.renderer.pass.RenderPass;
import com.jme.scene.state.CullState;
import com.jme.scene.state.LightState;
import com.jme.scene.state.TextureState;
import com.jme.scene.state.WireframeState;
import com.jme.scene.state.CullState.Face;
import com.jme.system.DisplaySystem;

/**
 * 
 */
public class SelectPass extends RenderPass {

	/**  */
	private static final long serialVersionUID = 1L;

	/**  */
	protected float selectTime = 0.0f;

	/**  */
	protected CullState backCull;

	/**  */
	protected WireframeState wireframeState;

	/**  */
	protected LightState noLights;

	/**  */
	protected TextureState noTexture;

	/**
     * 
     */
	public SelectPass() {

		wireframeState = DisplaySystem.getDisplaySystem().getRenderer().createWireframeState();
		wireframeState.setFace(WireframeState.Face.FrontAndBack);
		wireframeState.setLineWidth(1.0f);
		wireframeState.setEnabled(true);

		// On some systems anti-aliased lines only look good when AA is used for
		// the scene
		if(DisplaySystem.getDisplaySystem().getMinSamples() > 0) {
			wireframeState.setAntialiased(true);
		}
		else {
			wireframeState.setAntialiased(false);
		}

		backCull = DisplaySystem.getDisplaySystem().getRenderer().createCullState();
		backCull.setCullFace(Face.Back);
		backCull.setEnabled(true);

		noLights = DisplaySystem.getDisplaySystem().getRenderer().createLightState();
		noLights.setEnabled(false);

		noTexture = DisplaySystem.getDisplaySystem().getRenderer().createTextureState();
		noTexture.setEnabled(true);
	}

	/**
     * 
     */
	public void doRender(Renderer renderer) {

		if(spatials.size() == 0)
			return;

		if((selectTime < 0.25f) || ((selectTime > 0.5f) && (selectTime < 0.75f)) || ((selectTime > 1.0f) && (selectTime < 1.25f))) {

			renderer.clearZBuffer();
			context.enforceState(backCull);
			context.enforceState(noLights);
			super.doRender(renderer);

			context.enforceState(wireframeState);
			context.enforceState(noTexture);
			super.doRender(renderer);

			// revert state changes
			context.clearEnforcedStates();
		}
	}

	/**
     * 
     */
	public void resetTime() {

		selectTime = 0.0f;
	}

	/**
	 * 
	 * @param tpf
	 */
	public void updateTime(float tpf) {

		selectTime += tpf;
	}
}